﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BaseLinQ.DataContex;
using Core;
using DevExpress.Web.ASPxGridView;
using Module;
using Solution.AppCode;

namespace Solutions.Admin.QuanLyMenu
{
    public partial class QuanLyMenu : System.Web.UI.UserControl
    {
        string _conn = ConfigurationSettings.AppSettings["ConnectString"];
        RBACDataContext db = null;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                LoadGrid();
            }

            if (grdDanhSachMenu.IsCallback) // this line returns false
            {
                LoadGrid();
            }
        }
        protected void OpenForm_Click(object sender, EventArgs e)
        {
            wdsQuanLyMenu.ShowOnPageLoad = true;
            txtTenMenu.Focus();
            btnLuuLai.Visible = true;
            BindCboMenuParent(0);
            ResetForm();
            cboMenuCha.ReadOnly = false;
            btnUpdate.Visible = false;
            btnLuuLai.Visible = true;
            btnReset.Visible = true;

        }
        public void BindCboMenuParent(long _lngMenuID)
        {
            //Load tree parent menu
            MenuLogic logic = new MenuLogic();
            List<tbl_Menu> lstMenu = logic.GetTreeMenuForCbo(_lngMenuID);
            if (lstMenu != null && lstMenu.Count > 0)
            {
                cboMenuCha.DataSource = lstMenu;
                cboMenuCha.DataBind();
            }

            lstMenu = null;
            logic = null;
        }
        protected void LoadGrid()
        {
            MenuLogic logic = new MenuLogic();
            List<tbl_Menu> lstMenu = logic.GetTreeMenu();
            if (lstMenu != null && lstMenu.Count > 0)
            {
                grdDanhSachMenu.DataSource = lstMenu;
                grdDanhSachMenu.DataBind();
                lstMenu = null;
            }
        }
        public tbl_Menu GetObjectFromForm()
        {
            tbl_Menu objRes = new tbl_Menu();
            objRes.sTenMenu = Tools.ChuanHoaXau(txtTenMenu.Text);
            objRes.sTenControl = Tools.ChuanHoaXau(txtTenControl.Text);
            objRes.sGhiChu = Tools.ChuanHoaXau(txtsGhiChu.Text);
            if (cboMenuCha.Text != null && cboMenuCha.Text != "")
            {
                objRes.fk_iMenuChaID = long.Parse("0" + cboMenuCha.Value + "");
            }

            objRes.iSoThuTu = int.Parse(txtSoThuTu.Text);
            objRes.sTenThuMuc = Tools.ChuanHoaXau(txtTenThuMuc.Text);

            objRes.fk_iNguoiCapNhatID = Utils.GetUserId();
            return objRes;
        }
        protected void LuuLai_Click(object sender, EventArgs e)
        {
            if (txtTenMenu.Text == "")
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Tên menu không được để trống!');", true);
                wdsQuanLyMenu.ShowOnPageLoad = true;
                txtTenMenu.Focus();
                return;
            }
            if (txtTenThuMuc.Text == "")
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Tên thư mục không được để trống!');", true);
                wdsQuanLyMenu.ShowOnPageLoad = true;
                txtTenThuMuc.Focus();
                return;
            }
            if (txtSoThuTu.Text == "")
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Số thứ tự không được để trống!');", true);
                wdsQuanLyMenu.ShowOnPageLoad = true;
                txtSoThuTu.Focus();
                return;
            }
            db = new RBACDataContext(_conn);
            MenuLogic logic = new MenuLogic();
            tbl_Menu objMenu = GetObjectFromForm();
            tbl_Menu objCheck = (from m in db.tbl_Menus
                                 where m.bKichHoat == true
                                 && m.sTenMenu == objMenu.sTenMenu
                                 select m).FirstOrDefault<tbl_Menu>();
            if (objCheck != null)
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Tên menu đã tồn tại!');", true);
                wdsQuanLyMenu.ShowOnPageLoad = true;
                txtTenMenu.Focus();
                return;
            }
            objMenu.bKichHoat = true;
            objMenu.fk_iNguoiTaoID = Utils.GetUserId();
            objMenu.fk_iNguoiCapNhatID = Utils.GetUserId();

            db = new RBACDataContext(_conn);
            tbl_Menu checkr = new tbl_Menu();
            if (objMenu.fk_iMenuChaID == null)
            {
                checkr = (from m in db.tbl_Menus
                          where m.pk_iMenuID != objMenu.pk_iMenuID
                          && m.iSoThuTu == objMenu.iSoThuTu
                          && m.fk_iMenuChaID == null
                          && m.bKichHoat == true
                          select m).FirstOrDefault<tbl_Menu>();
            }
            else
            {
                checkr = (from m in db.tbl_Menus
                          where m.iSoThuTu == objMenu.iSoThuTu
                          && m.fk_iMenuChaID == objMenu.fk_iMenuChaID
                          && m.bKichHoat == true
                          select m).FirstOrDefault<tbl_Menu>();
            }
            if (checkr != null)
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Trùng số thứ tự menu!');", true);
                wdsQuanLyMenu.ShowOnPageLoad = true;
                txtSoThuTu.Focus();
                return;
            }
            //Insert
            if (logic.Insert(objMenu))
            {
                if (objMenu.fk_iMenuChaID != null)
                {
                    objMenu.sPath = logic.GetByID(long.Parse(objMenu.fk_iMenuChaID.ToString())).sPath + objMenu.pk_iMenuID + "/";
                }
                else
                    objMenu.sPath = "/" + objMenu.pk_iMenuID + "/";
                logic.Update(objMenu);
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Thêm mới menu thành công!');", true);
                BindCboMenuParent(0);
                LoadGrid();
                ResetForm();
                txtTenMenu.Focus();
            }
            else
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Thêm mới thất bại! Kiểm tra lại dữ liệu nhập vào!');", true);
                wdsQuanLyMenu.ShowOnPageLoad = true;
                return;
            }
            logic = null;
            wdsQuanLyMenu.ShowOnPageLoad = false;
        }
        protected void ResetForm()
        {
            txtTenMenu.Text = "";
            txtTenControl.Text = "";
            txtTenThuMuc.Text = "";
            txtsGhiChu.Text = "";
            txtSoThuTu.Text = "";
            cboMenuCha.Value = "";
            cboMenuCha.Text = "";
            cboMenuCha.ReadOnly = false;
        }
        public void grdTest_RowCommand(object sender, ASPxGridViewRowCommandEventArgs e)
        {
            int id = Convert.ToInt32(e.KeyValue);
            switch (e.CommandArgs.CommandName)
            {
                case "Edit":
                    EditMenu(id);
                    break;
                case "Delete":
                    DeleteMenu(id);
                    break;
            }
        }
        protected void DeleteMenu(long id)
        {
            MenuLogic logic = new MenuLogic();
            db = new RBACDataContext(_conn);
            tbl_Quyen objQuyen = (from m in db.tbl_Quyens
                                  where m.fk_iMenuID == id
                                  && m.bKichHoat == true
                                  select m).FirstOrDefault<tbl_Quyen>();
            if (objQuyen != null)
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Không thể xóa vì menu được sử dụng trong Quản lý Quyền!');", true);
                return;
            }
            else if (logic.CheckMenuCon(id))
            {

                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Không thể xóa vì tồn tại menu con!');", true);
                return;

            }
            else
            {
                if (logic.Delete(id))
                {
                    
                    ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Xóa menu thành công!');", true);
                    LoadGrid();
                    return;
                }
                else
                {
                    ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Xóa menu thất bại!');", true);
                    return;
                }
            }
        }

        protected void EditMenu(long id)
        {
            hdIdMenu.Text = id + "";
            BindCboMenuParent(id);
            LoadFromByID(id);
            btnUpdate.Visible = true;
            btnLuuLai.Visible = false;
            btnReset.Visible = false;
            txtTenMenu.Focus();
            wdsQuanLyMenu.ShowOnPageLoad = true;
        }
        protected void Reset_Click(object sender, EventArgs e)
        {
            ResetForm();
            txtTenMenu.Focus();
        }
        protected void Update_Click(object sender, EventArgs e)
        {
            if (txtTenMenu.Text == "")
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Tên menu không được để trống!');", true);
                wdsQuanLyMenu.ShowOnPageLoad = true;
                txtTenMenu.Focus();
                return;
            }
            if (txtTenThuMuc.Text == "")
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Tên thư mục không được để trống!');", true);
                wdsQuanLyMenu.ShowOnPageLoad = true;
                txtTenThuMuc.Focus();
                return;
            }
            if (txtSoThuTu.Text == "")
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Thông báo", "alert('Số thứ tự không được để trống!');", true);
                wdsQuanLyMenu.ShowOnPageLoad = true;
                txtSoThuTu.Focus();
                return;
            }
            db = new RBACDataContext(_conn);
            MenuLogic logic = new MenuLogic();
            tbl_Menu objMenu = GetObjectFromForm();
            long lngMenuID = long.Parse("0" + hdIdMenu.Text);
            objMenu.pk_iMenuID = lngMenuID;
            if (objMenu.fk_iMenuChaID != null)
            {
                objMenu.sPath = logic.GetByID(long.Parse(objMenu.fk_iMenuChaID.ToString())).sPath + objMenu.pk_iMenuID + "/";
            }
            else
                objMenu.sPath = "/" + objMenu.pk_iMenuID + "/";
            tbl_Menu objCheck = (from m in db.tbl_Menus
                                 where m.bKichHoat == true
                                 && m.pk_iMenuID != objMenu.pk_iMenuID
                                 && m.sTenMenu == objMenu.sTenMenu
                                 select m).FirstOrDefault<tbl_Menu>();
            if (objCheck != null)
            {
                Tools.Message(this.Page, "Tên menu đã tồn tại!");
                return;
            }
            //Kiểm tra trùng thứ tự
            db = new RBACDataContext(_conn);
            tbl_Menu checkr = new tbl_Menu();
            if (objMenu.fk_iMenuChaID == null)
            {
                checkr = (from m in db.tbl_Menus
                          where m.pk_iMenuID != objMenu.pk_iMenuID
                          && m.iSoThuTu == objMenu.iSoThuTu
                          && m.fk_iMenuChaID == null
                          && m.bKichHoat == true
                          select m).SingleOrDefault<tbl_Menu>();
            }
            else
            {
                checkr = (from m in db.tbl_Menus
                          where m.pk_iMenuID != objMenu.pk_iMenuID
                          && m.iSoThuTu == objMenu.iSoThuTu
                          && m.fk_iMenuChaID == objMenu.fk_iMenuChaID
                          && m.bKichHoat == true
                          select m).SingleOrDefault<tbl_Menu>();
            }
            if (checkr != null)
            {
                Tools.Message(this.Page,"Trùng thứ tự menu!");
                return;
            }

            //Update
            try
            {
                if (logic.Update(objMenu))
                {
                    Tools.Message(this.Page, "Cập nhật thành công!");
                    wdsQuanLyMenu.ShowOnPageLoad = false;
                    LoadGrid();
                }
                else
                {
                    Tools.Message(this.Page, "Cập nhật thất bại!");
                    wdsQuanLyMenu.ShowOnPageLoad = false;
                }
            }
            catch (Exception ex)
            {
                Tools.Message(this.Page, "Cập nhật thất bại!");
                wdsQuanLyMenu.ShowOnPageLoad = false;
                return;
            }
        }
        public void LoadFromByID(long lngMenuID)
        {
            MenuLogic logic = new MenuLogic();
            tbl_Menu objMenu = logic.GetByID(lngMenuID);
            if (objMenu != null && objMenu.pk_iMenuID > 0)
            {
                if (objMenu.fk_iMenuChaID == null || objMenu.fk_iMenuChaID <= 0)
                {
                    cboMenuCha.ReadOnly = true;
                    //cboMenuCha.AllowBlank = true;
                }
                else
                {
                    cboMenuCha.ReadOnly = false;
                    //cboMenuCha.AllowBlank = false;
                }
                txtTenMenu.Text = objMenu.sTenMenu;
                txtTenControl.Text = objMenu.sTenControl;
                txtsGhiChu.Text = objMenu.sGhiChu;
                txtSoThuTu.Text = objMenu.iSoThuTu + "";
                txtTenThuMuc.Text = objMenu.sTenThuMuc;
                cboMenuCha.Text = objMenu.fk_iMenuChaID + "";

            }
            logic = null;
        }

    }
}